const fsm = wx.getFileSystemManager();
const FILE_BASE_NAME = 'tmp_base64src'; //自定义文件名


const base64src = (base64data, cb) => {
  return new Promise((reslove, reject) => {
    const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64data) || [];
    if (!format) {
      reject('ERROR_BASE64SRC_PARSE')
    }
    const filePath = `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.${format}`;
    const buffer = wx.base64ToArrayBuffer(bodyData);
    fsm.writeFile({
      filePath,
      data: buffer,
      encoding: 'binary',
      success() {
        reslove(filePath);
      },
      fail() {
        reject('ERROR_BASE64SRC_WRITE')
      },
    });
  })
}

const getImageInfo = (picurl) => {
  return new Promise((reslove, reject) => {
    wx.getImageInfo({
      src: picurl,
      success: function (res) {
        let picPath = res.path
        reslove(picPath)
      },
      fail: (err) => {
        wx.hideLoading()
        wx.showModal({
          title: '温馨提示',
          content: '图片保存失败，请重试',
          showCancel: false
        })
      }
    })
  })
}

// 保存图片到相册
const savePhoto_share = (myCanvas, _this, bgImg, codeImg, avatarUrl, nickName, codeNum) => {

  return new Promise((reslove, reject) => {
    base64src(codeImg).then((res) => {
      let newCode = res;
      console.log(newCode)
      // 返回图片地址，直接赋值到image标签即可
      let that = _this;
      let imgs = bgImg;
      let headPortrait = avatarUrl;
      // 提示用户正在合成，否则用户可能有不当操作或者以为手机卡死
      console.log(imgs)
      wx.showLoading({
        title: '合成中......',
        mask: true
      })
      // 创建画布对象
      const ctx = wx.createCanvasContext(myCanvas, that)
      // 获取图片信息，要按照原图来绘制，否则图片会变形 
      wx.getImageInfo({
        src: imgs,
        success: function (res) {
          // 根据 图片的大小 绘制底图 的大小
          let imgW = res.width
          let imgH = res.height
          let imgPath = res.path
          that.setData({
            canvasHeight: imgH,
            canvasWidth: imgW
          })
          // bgw bgh
          // 绘制底图 用原图的宽高比绘制
          ctx.drawImage(imgPath, 0, 0, imgW, imgH)
          wx.getImageInfo({
            src: newCode, //头像
            success: function (res) {
              let codePath = res.path;
              console.log(codePath);
              console.log(headPortrait)

              ctx.setFillStyle('#ffffff')
              ctx.fillRect(0, 630, 630, 354)

              ctx.save(); // 先保存状态 已便于画完圆再用
              ctx.beginPath(); //开始绘制
              ctx.drawImage(codePath, 430, 760, 124, 124);
              ctx.restore();

              ctx.setFontSize(24)
              ctx.setFillStyle('#999999')
              ctx.fillText('扫码进入超有幸福', 400, 920);

              ctx.setFontSize(28)
              ctx.setFillStyle('#333333')
              ctx.fillText('您的会员专属码', 40, 860);

              ctx.setFontSize(48)
              ctx.setFillStyle('#fc7112')
              ctx.fillText(codeNum, 40, 932);

              // 字体颜色
              ctx.setFontSize(28)
              ctx.setFillStyle('#333333')
              ctx.fillText(nickName, 140, 715);

              getImageInfo(headPortrait).then(picPath => {
                ctx.save(); // 先保存状态 已便于画完圆再用
                ctx.beginPath(); //开始绘制
                ctx.arc(82, 708, 42, 0, Math.PI * 2, false);
                ctx.clip();
                ctx.drawImage(picPath, 40, 666, 84, 84);
                ctx.restore();

                ctx.draw();

                wx.hideLoading()
                wx.showLoading({
                  title: '正在保存',
                  mask: true
                })
                setTimeout(() => {
                  wx.canvasToTempFilePath({
                    canvasId: myCanvas,
                    success: function (res) {
                      let tempFilePath = res.tempFilePath
                      // 保存到相册
                      wx.saveImageToPhotosAlbum({
                        filePath: tempFilePath,
                        success(res) {
                          wx.hideLoading()
                          wx.showModal({
                            title: '温馨提示',
                            content: '图片保存成功，可在相册中查看',
                            showCancel: false,
                            success(res) {
                              if (res.confirm) {
                                reslove()
                              }
                            }
                          })
                        },
                        fail(res) {
                          wx.hideLoading()
                          wx.showModal({
                            title: '温馨提示',
                            content: '图片保存失败，请重试',
                            showCancel: false
                          })
                          reject();
                        }
                      })
                    },
                    fail: function (res) {
                      wx.hideLoading()
                      wx.showModal({
                        title: '温馨提示',
                        content: '小程序码图片合成失败，请重试',
                        showCancel: false
                      })
                      reject();
                    }
                  }, that)
                }, 1500)
              })
            },
            fail: function (err) {
              console.log('eeeeeeeeeeeeee' + err)
              wx.showModal({
                title: '温馨提示',
                content: '获取图片信息失败，请重试2',
                showCancel: false
              })
            }
          })


        },
        fail(err) {
          console.log(err)
          wx.hideLoading()
          wx.showModal({
            title: '温馨提示',
            content: '获取图片信息失败，请重试',
            showCancel: false
          })
        }
      })
    })
  })

  // x/y在背景图的位置，w/h镶嵌图的大小,bgw/bgh背景图大小
  //myCanvas Canvas-id

}

// 洗衣店分享
const savePhoto_laundry = (myCanvas, _this, bgImg, Counter_img, laundry_title, laundry_device, laundry_device_img) => {

  return new Promise((reslove, reject) => {
    let that = _this;
    // 提示用户正在合成，否则用户可能有不当操作或者以为手机卡死
    wx.showLoading({
      title: '合成中......',
      mask: true
    })
    // 创建画布对象
    const ctx = wx.createCanvasContext(myCanvas, that)
    // 获取图片信息，要按照原图来绘制，否则图片会变形 
    wx.getImageInfo({
      src: bgImg,
      success: function (res) {
        // 根据 图片的大小 绘制底图 的大小
        let imgPath = res.path

        // 绘制底图 用原图的宽高比绘制
        ctx.drawImage(imgPath, 0, 0, '670px', '670px')

        ctx.setFillStyle('#ffffff')
        ctx.fillRect(0, 670, 670, 274)

        ctx.setFontSize(28)
        ctx.setFillStyle('#333333')
        ctx.fillText(laundry_title, 200, 738);

        ctx.setFontSize(28)
        ctx.setFillStyle('#333333')
        ctx.fillText('扫码进入', 512, 898);

        ctx.setFontSize(28)
        ctx.setFillStyle('#999999')
        ctx.fillText(laundry_device, 200, 838);

        getImageInfo(Counter_img).then(laundry_img => {

          ctx.save(); // 先保存状态 已便于画完圆再用
          ctx.beginPath(); //开始绘制
          ctx.drawImage(laundry_img, 40, 710, 140, 140);
          ctx.restore();

          getImageInfo(laundry_device_img).then(picPath => {

            ctx.save(); // 先保存状态 已便于画完圆再用
            ctx.beginPath(); //开始绘制
            ctx.drawImage(picPath, 490, 710, 140, 140);
            ctx.restore();

            ctx.draw();

            wx.hideLoading()
            wx.showLoading({
              title: '正在保存',
              mask: true
            })
            setTimeout(() => {
              wx.canvasToTempFilePath({
                canvasId: myCanvas,
                success: function (res) {
                  let tempFilePath = res.tempFilePath
                  // 保存到相册
                  wx.saveImageToPhotosAlbum({
                    filePath: tempFilePath,
                    success(res) {
                      wx.hideLoading()
                      getApp().showModal('图片保存成功，可在相册中查看').then(() => {
                        reslove()
                      })
                    },
                    fail(res) {
                      wx.hideLoading()
                      getApp().showModal('图片保存失败，请重试')
                      reject();
                    }
                  })
                },
                fail: function (res) {
                  wx.hideLoading()
                  getApp().showModal('小程序码图片合成失败，请重试')
                  reject();
                }
              }, that)
            }, 1500)
          })

        })

      },
      fail(err) {
        getApp().showModal('获取图片信息失败，请重试')
      }
    })
  })

}

// 店铺二维码分享
const save_shop_code = (myCanvas, _this, bgImg, code_img, text = '扫码进入') => {

  return new Promise((reslove, reject) => {
    let that = _this;
    // 提示用户正在合成，否则用户可能有不当操作或者以为手机卡死
    wx.showLoading({
      title: '合成中......',
      mask: true
    })
    // 创建画布对象
    const ctx = wx.createCanvasContext(myCanvas, that)
    // 获取图片信息，要按照原图来绘制，否则图片会变形 
    wx.getImageInfo({
      src: bgImg,
      success: function (res) {
        // 根据 图片的大小 绘制底图 的大小
        let imgPath = res.path

        // 绘制底图 用原图的宽高比绘制
        ctx.drawImage(imgPath, 0, 0, '502px', '728px')

        ctx.setFontSize(20)
        ctx.setFillStyle('#797979')
        ctx.setTextAlign('center')
        ctx.fillText(text, 251, 590);

        getImageInfo(code_img).then(picPath => {

          ctx.save(); // 先保存状态 已便于画完圆再用
          ctx.beginPath(); //开始绘制
          ctx.drawImage(picPath, 140, 308, 224, 224);
          ctx.restore();

          ctx.draw();

          wx.hideLoading()
          wx.showLoading({
            title: '正在保存',
            mask: true
          })
          setTimeout(() => {
            wx.canvasToTempFilePath({
              canvasId: myCanvas,
              success: function (res) {
                let tempFilePath = res.tempFilePath
                // 保存到相册
                wx.saveImageToPhotosAlbum({
                  filePath: tempFilePath,
                  success(res) {
                    wx.hideLoading()
                    getApp().showModal('图片保存成功，可在相册中查看').then(() => {
                      reslove()
                    })
                  },
                  fail(res) {
                    wx.hideLoading()
                    getApp().showModal('图片保存失败，请重试')
                    reject();
                  }
                })
              },
              fail: function (res) {
                wx.hideLoading()
                getApp().showModal('小程序码图片合成失败，请重试')
                reject();
              }
            }, that)
          }, 1500)
        })

      },
      fail(err) {
        getApp().showModal('获取图片信息失败，请重试')
      }
    })
  })

}

// 支付宝二维码分享
const zfb_pay_code = (myCanvas, _this, bgImg, code_img) => {

  return new Promise((reslove, reject) => {
    let that = _this;
    // 提示用户正在合成，否则用户可能有不当操作或者以为手机卡死
    wx.showLoading({
      title: '合成中......',
      mask: true
    })
    // 创建画布对象
    const ctx = wx.createCanvasContext(myCanvas, that)
    // 获取图片信息，要按照原图来绘制，否则图片会变形 
    wx.getImageInfo({
      src: bgImg,
      success: function (res) {
        // 根据 图片的大小 绘制底图 的大小
        let imgPath = res.path

        // 绘制底图 用原图的宽高比绘制
        ctx.drawImage(imgPath, 0, 0, '502px', '782px')

        getImageInfo(code_img).then(picPath => {

          ctx.save(); // 先保存状态 已便于画完圆再用
          ctx.beginPath(); //开始绘制
          ctx.drawImage(picPath, 140, 286, 224, 224);
          ctx.restore();

          ctx.draw();

          wx.hideLoading()
          wx.showLoading({
            title: '正在保存',
            mask: true
          })
          setTimeout(() => {
            wx.canvasToTempFilePath({
              canvasId: myCanvas,
              success: function (res) {
                let tempFilePath = res.tempFilePath
                // 保存到相册
                wx.saveImageToPhotosAlbum({
                  filePath: tempFilePath,
                  success(res) {
                    wx.hideLoading()
                    getApp().showModal('图片保存成功，可在相册中查看').then(() => {
                      reslove()
                    })
                  },
                  fail(res) {
                    wx.hideLoading()
                    getApp().showModal('图片保存失败，请重试')
                    reject();
                  }
                })
              },
              fail: function (res) {
                wx.hideLoading()
                getApp().showModal('小程序码图片合成失败，请重试')
                reject();
              }
            }, that)
          }, 1500)
        })

      },
      fail(err) {
        getApp().showModal('获取图片信息失败，请重试')
      }
    })
  })

}

const save_card_code = (myCanvas, _this, bgImg, code_img, text, avatar_img, avatar_bg) => {
  return new Promise((reslove, reject) => {
    let that = _this;
    // 提示用户正在合成，否则用户可能有不当操作或者以为手机卡死
    wx.showLoading({
      title: '合成中......',
      mask: true
    })
    // 创建画布对象
    const ctx = wx.createCanvasContext(myCanvas, that)
    // 获取图片信息，要按照原图来绘制，否则图片会变形 
    wx.getImageInfo({
      src: bgImg,
      success: function (res) {
        // 根据 图片的大小 绘制底图 的大小
        let imgPath = res.path

        // 绘制底图 用原图的宽高比绘制
        ctx.drawImage(imgPath, 0, 0, '648px', '960px')

        ctx.setFontSize(28)
        ctx.setFillStyle('#ffffff')
        ctx.setTextAlign('center')
        ctx.fillText(text, 324, 480);

        getImageInfo(code_img).then(picPath => {

          ctx.save(); // 先保存状态 已便于画完圆再用
          ctx.beginPath(); //开始绘制
          ctx.drawImage(picPath, 446, 772, 146, 146);
          ctx.restore();


          getImageInfo(avatar_img).then(avatar_path => {
            ctx.save(); // 先保存状态 已便于画完圆再用
            ctx.beginPath(); //开始绘制
            let avatar_img_x = 209
            let avatar_img_y = 212
            let avatar_img_w = 230
            let avatar_img_h = 230
            let avatar_img_r = 20
            ctx.moveTo(avatar_img_x + avatar_img_r, avatar_img_y);
            ctx.lineTo(avatar_img_x + avatar_img_w - avatar_img_r, avatar_img_y);
            ctx.quadraticCurveTo(avatar_img_x + avatar_img_w, avatar_img_y, avatar_img_x + avatar_img_w, avatar_img_y + avatar_img_r);
            ctx.lineTo(avatar_img_x + avatar_img_w, avatar_img_y + avatar_img_h - avatar_img_r);
            ctx.quadraticCurveTo(avatar_img_x + avatar_img_w, avatar_img_y + avatar_img_h, avatar_img_x + avatar_img_w - avatar_img_r, avatar_img_y + avatar_img_h);
            ctx.lineTo(avatar_img_x + avatar_img_r, avatar_img_y + avatar_img_h);
            ctx.quadraticCurveTo(avatar_img_x, avatar_img_y + avatar_img_h, avatar_img_x, avatar_img_y + avatar_img_h - avatar_img_r);
            ctx.lineTo(avatar_img_x, avatar_img_y + avatar_img_r);
            ctx.quadraticCurveTo(avatar_img_x, avatar_img_y, avatar_img_x + avatar_img_r, avatar_img_y);
            ctx.closePath();
            ctx.clip();
            ctx.drawImage(avatar_path, 209, 212, 230, 230);
            ctx.restore();


            getImageInfo(avatar_bg).then(avatar_bg_path => {
              ctx.save(); // 先保存状态 已便于画完圆再用
              ctx.beginPath(); //开始绘制
              ctx.drawImage(avatar_bg_path, 209, 212, 230, 230);
              ctx.restore();

              ctx.draw();

              wx.hideLoading()
              wx.showLoading({
                title: '正在保存',
                mask: true
              })
              setTimeout(() => {
                wx.canvasToTempFilePath({
                  canvasId: myCanvas,
                  success: function (res) {
                    let tempFilePath = res.tempFilePath
                    // 保存到相册
                    wx.saveImageToPhotosAlbum({
                      filePath: tempFilePath,
                      success(res) {
                        wx.hideLoading()
                        getApp().showModal('图片保存成功，可在相册中查看').then(() => {
                          reslove()
                        })
                      },
                      fail(res) {
                        wx.hideLoading()
                        getApp().showModal('图片保存失败，请重试')
                        reject();
                      }
                    })
                  },
                  fail: function (res) {
                    wx.hideLoading()
                    getApp().showModal('小程序码图片合成失败，请重试')
                    reject();
                  }
                }, that)
              }, 1500)

            })



          })






        })

      },
      fail(err) {
        getApp().showModal('获取图片信息失败，请重试')
      }
    })
  })
}

module.exports = {
  base64src,
  savePhoto_share,
  savePhoto_laundry,
  save_shop_code,
  zfb_pay_code,
  save_card_code
}